home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / lollipop / lollipop.hqx / Lollipop v0.93 / text.tex < prev    next >
Text File  |  1992-11-19  |  14KB  |  469 lines

  1. % Text.tex copyright 1992 Victor Eijkhout
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. %%%%% Text Blocks
  4.  
  5. \@GenericConstruct{TextBlock}
  6.  
  7. % \temptoksa : gebruikt door lijstcommando's
  8. % \cs@d : commandolijstletter
  9. %         d : label %%% really?
  10.  
  11. % commands can be before and after text
  12. % store in two token lists
  13. % switch from one to other by option 'text'
  14. % this may also be used by ParagraphShape
  15. %
  16. \newtoks\before@coms \newtoks\after@coms
  17. \add@TextBlock@default
  18.    {\before@coms{} \after@coms{}
  19.     \def\@current@options@list{before@coms}
  20.     \def\switch@lists{\at@breakpointyes
  21.         \def\@current@options@list{after@coms}}
  22.     }
  23. \@TextBlockOption{text}{\switch@lists}
  24.  
  25. \def\@DefineTextBlock{
  26.     \csarg\edef{\@name}{\@gen@open
  27.         \the\before@coms
  28.         }
  29.     \@DefineStopCommand{\the\after@coms \@gen@close}
  30.     }
  31.  
  32.     
  33.  
  34. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  35. %%%%% A L I N E A V O R M E N
  36. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  37. % via \everypar:
  38. % \everypar={\@everyeverypar { ...locaal spul...
  39. %                              \def\par{... \@par\egroup}
  40. \@GenericConstruct{ParagraphShape}
  41.  
  42. %%%%!!!!!!!!!!!!!!!!
  43. % not functioning.
  44. % note: \@defaulteverypar is installed now
  45. % as a start@command!
  46.  
  47. %% anonieme namen
  48. % \iftempa : moet dit inspringen
  49. % \iftempb : speciale behandeling staart?
  50.  
  51. \def\@ParagraphShapeverstekwaardes{
  52.     \tempano \tempbno
  53.     \temptoksb={} \temptoksc={}
  54.     \def\cs@d{b}\def\@current@options@list{temptoks\cs@d}
  55.     }
  56. \def\@DefineParagraphShape{
  57.     \csarg{\edef}{\@name}{%
  58.           \CSname{AltijdInspringen\iftempa yes\else no\fi}%
  59.           \nxp\everypar={\nxp\@everyeverypar
  60.               \iftempb \bgroup \fi
  61.               \the\temptoksb 
  62.               \iftempb \parfillskip\z@ 
  63.                   \else \if@erislinkswit \parfillskip\z@ \fi\fi
  64.               \relax
  65.               \iftempb \def\nxp\par{\nxp\unskip\nxp\nobreak\the\temptoksc 
  66.                                   \hbox{}\nxp\@par\egroup}\fi
  67.          }}              }
  68.  
  69. \@ParagraphShapeNOOP{verticaal}
  70.  
  71. %-- inspringen
  72. \@ParagraphShapeOption{inspringen}{
  73.     \if\EqualString{#1}{no}\else\tempayes\fi}
  74.  
  75. %-- tekst
  76. \@ParagraphShapeOption{tekst}{\tempbyes\def\cs@d{c}}
  77.  
  78.  
  79. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  80. %%%%%%%%%%%%%%%% U T I L I T I E S
  81. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  82.  
  83. %%%%%%%%%%%%%%%% Space, white space
  84. %
  85. % unit space \@@space is set by switching font style
  86. %
  87. \newdimen\@@space \@@space=.5em
  88. \def\Spaces:#1 {\hskip#1\@@space}
  89.  
  90. % handig voor bibliografieen
  91. \def\lax{\tolerance\@m \hfuzz\p@}
  92.  
  93.  
  94. %%%%%%%%%%%%%%%%%%%%%%%
  95. % White space
  96. %
  97. \NewTrace:skip
  98.  
  99. \def\hwhite:#1 {\@hwhite{#1}}
  100. \def\@hwhite#1{\ifhmode\unskip\fi\relax 
  101.     \if\EqualString{#1}{fillup}\hfill\else\hskip\@ww{#1}\relax\fi}
  102.  
  103. % Vertical
  104. % subtle: argument should be placed even if
  105. % size is equal: stretch may be different,
  106. % probably more. (cf \par\vwit{0pt plus 1fil} )
  107. %
  108. \def\vwhite:#1 {\@vwhite{#1}}
  109. \@GenericOption{vwhite}{\protect@breakpoint
  110.     \@add@toks{\@vwhite{#1}}\at@breakpointno}
  111. \def\@vwhite#1{\tempskipa=\@ww{#1}\relax \tempskipb\lastskip
  112.     \Tmessage[skip]{Considering vskip \the\tempskipa}%
  113.     \ifvmode \ifdim\tempskipb>\tempskipa
  114.              \Tmessage[skip]{Ignored. (lastskip=\the\tempskipb)}%
  115.           \else \Tmessage[skip]{Backvspacing \the\tempskipb}%
  116.              \vskip-\tempskipb 
  117.              \Tmessage[skip]{Vskip \the\tempskipa}%
  118.              \vskip\tempskipa \fi
  119.     \else \if\EqualString{#1}{fillup}\hfill
  120.           \else\vskip\tempskipa \fi
  121.     \fi}
  122.  
  123. % advance skip by literal or name of control sequence
  124. \def\advance@skip#1#2{\advance#1\@ww{#2}\relax}
  125.  
  126. % only backspace the previous; 
  127. % in this case prevent creating a breakpoint
  128. % if there was no glue
  129. %
  130. \def\bvwhite#1{\tempskipa=\@ww{#1}\relax \tempskipb\lastskip
  131.     \Tmessage[skip]{Clearing for vskip \the\tempskipa}%
  132.     \ifvmode \ifdim\lastskip>\tempskipa 
  133.         \else \ifdim\lastskip=\z@ 
  134.             \else \vskip-\tempskipb\relax 
  135.                   \Tmessage[skip]{Backspaced}\fi
  136.     \fi \fi}
  137. \def\unhskip{\ifhmode\unskip\fi}
  138. \def\leavehmode{\unvbox\voidb@x}
  139. \def\novbreak{\leavehmode\nobreak}
  140.  
  141. \def\white:#1 {\@white{#1}}
  142. \@GenericOption{white}{\protect@breakpoint
  143.     \@add@toks{\@white{#1}}\at@breakpointyes}
  144. \def\@white#1{\ifhmode\@hwhite{#1}\else
  145.     \ifvmode\@vwhite{#1}\fi\fi}
  146. \def\fillup{\@white{0pt plus1fill}}
  147.  
  148. \def\@@distance#1{\csarg\newskip{#1}}
  149. \def\Distance:#1=#2
  150.    {\if\UndefinedCS{#1}\@@distance{#1}\fi
  151.     \edef\cs@e{\global\noexpand\set@value{#1}%
  152.                \if\UndefinedCS{#2}{#2}%
  153.                \else \CSname{#2}\fi}
  154.     \cs@e}
  155. \def\AdaptiveDistance:#1=#2 {\Distance:#1=#2
  156.     \adds@stop@command
  157.       {\immediate\write\aux@file
  158.          {\string\Distance:#1={\xp\the\csn#1\ecs} }}}
  159.  
  160. \Distance:filler={0pt plus 1fil}
  161. \parindent=30pt
  162. \parskip=0pt
  163. \parfillskip=0cm plus 1 fil
  164. \baselineskip=12pt
  165.  
  166. %%%%%%%%%%%%%%%% Rules
  167. \@GenericOption{rule}{
  168.     \if\EqualString{#1}{h}\protect@breakpoint
  169.          \@add@toks{\hrule#2\relax}
  170.          \at@breakpointyes
  171.     \else\if\EqualString{#1}{v}\@add@toks{\vrule#2\relax}
  172.          \else\Wmessage{Strange option: <rule:#1=#2>}
  173.     \fi  \fi}
  174. \@GenericOption{hrule}{\protect@breakpoint
  175.     \@add@toks{\hrule}\at@breakpointyes}
  176. \@GenericOption{vrule}{\@add@toks{\vrule}}
  177.  
  178. %%%%%%%%%%%%%%%% Indentation Control
  179. % default value for all paragraphs set by AlwaysIndent
  180. % this one is set by by the user,
  181. % or by 'indentinside' option of paragraph shapes
  182. %
  183. \DefineTest:AlwaysIndent
  184. \AlwaysIndent:yes
  185.  
  186. % override by Indent
  187. % can be set by the user,
  188. % or by start/end of text constructs
  189. %
  190. \DefineTest:Indent       %forceer/onderdruk inspringen
  191.  
  192. % Remove indentation
  193. % this is executed by \every@everypar
  194. %
  195. \def\controlled@indentation
  196.    {\ifAlwaysIndent
  197.           \ifIndent \else \remove@indent \Indent:yes \fi
  198.     \else \ifIndent \Indent:no \else \remove@indent \fi
  199.     \fi}
  200. \def\remove@indent{{\setbox0=\lastbox}}
  201.  
  202. \def\noindentation{\AlwaysIndentno \Indentno}
  203.  
  204. % Indentation control in Universal Block
  205. % control sequences \first@indent \inside@indent \after@indent
  206. % are called (in \edef context) in general open/close macros
  207. % for universal environments
  208.  
  209. % Indent after this block
  210. % \global because the block may be in a further group
  211. %
  212. \add@generic@default{\def\after@indent{\global\nxp\Indent:no }}
  213. \@GenericOption{indentafter}{
  214.     \def\after@indent{\global\nxp\Indent:#1 }}
  215.  
  216. % Indent in this block
  217. \add@generic@default{\def\inside@indent{}}
  218. \@GenericOption{indentinside}{
  219.     \def\inside@indent{\nxp\AlwaysIndent:#1 }}
  220.  
  221. % Indent first in this block
  222. \add@generic@default{\def\first@indent{\nxp\Indent:no }}
  223. \@GenericOption{indentfirst}{
  224.     \def\first@indent{\nxp\Indent:#1 }}
  225.  
  226. %%%% Level dependent indentation
  227. %
  228. \NewTrace:indent
  229.  
  230. % Lots of commands and parameters
  231. %
  232. % \levelindent is the indentation that will be taken
  233. %    on the current level, jumping to the next
  234. %
  235. \newdimen\levelindent 
  236.  
  237. % \previousindent is the indentation that got us to this level
  238. %    list item labels have to outdent over this amount
  239. %
  240. \newdimen\previousindent \previousindent\z@
  241.  
  242. % indentlevel counter: used to generate automatic indentation,
  243. %    for instance \levelindentvi for level vi
  244. %
  245. \new@@counter{indentlevel}
  246. \set@counter{indentlevel}\@ne
  247.  
  248. % \set@level@indent : set \levelindent to automatically
  249. %    generated indentation; if \levelindentiii is defined take it,
  250. %    otherwise use \@@level@indent{3}, which uses fraction
  251. %    of a \basicindent
  252. %
  253. \def\set@level@indent{\levelindent=
  254.     \level@indent{\cs@counter@name{indentlevel}}}
  255. \def\level@indent
  256.  #1{\if\UndefinedCS{\@level@indent{#1}}\@@level@indent{#1}%
  257.     \else \csname \@level@indent{#1}\endcsname \fi}
  258. \def\@level@indent#1{levelindent\romannumeral#1}
  259. \def\@@level@indent#1{\ifcase#1\z@\or
  260.  \basicindent \or .75\basicindent \else .5\basicindent \fi}
  261.  
  262. \DefineTest:BasicIndentIsSet
  263. % the following lines appear as the last command in \Start,
  264. % so that the user can tinker with \parindent
  265. % through adaptive distances or in the style
  266. %\ifBasicIndentIsSet\else\Distance:basicindent=parindent\fi
  267. %\set@level@indent
  268.  
  269. % \SetLevelIndent : set exact amount of indentation for
  270. %    specific level
  271. %
  272. \def\LevelIndent:#1=#2 {\csarg\edef{\@level@indent{#1}}{\@ww{#2}}}
  273.  
  274. % Push/Pop indentlevels
  275. %
  276. \def\PushIndentLevel
  277.    {\Tmessage[indent]{Old indent: \the\leftskip}%
  278.     \advance\leftskip\levelindent 
  279.     \previousindent=\levelindent
  280.     \step@counter{indentlevel}\set@level@indent
  281.     \Tmessage[indent]{New indent: \the\leftskip, 
  282.                       at level \the\cs@counter@name{indentlevel}}%
  283.     }
  284.  
  285. % Popping an indent level requires two pops: one for the \levelindent
  286. % and one for the \previousindent. This last one then has to be 
  287. % pushed again.
  288. %
  289. \def\PopIndentLevel
  290.    {\ifnum\cs@counter@name{indentlevel}=\@ne
  291.         \Emessage{Pop indent level attempted at outer level}
  292.     \else \back@step@counter{indentlevel}%
  293.         \back@step@counter{indentlevel}%
  294.         \set@level@indent \previousindent\levelindent
  295.         \step@counter{indentlevel}%
  296.         \set@level@indent\advance\leftskip-\levelindent
  297.     \fi}
  298.  
  299. %%%%%%%%%%%%%%%% Paragraph Skip control
  300. % parskip is stored and set to zero at the start and end
  301. % of environments
  302. \newskip\@restoreparskip 
  303.  
  304. % it is recorded if a parskip has been stored
  305. %
  306. \newif\if@parskipsaved \@parskipsavedno
  307.  
  308. % Do no parskip
  309. % used at start of environment
  310. %
  311. \def\hold@parskip
  312.    {\@restoreparskip\parskip \parskip\z@ \@parskipsavedyes}
  313.  
  314. % Hold off parskip
  315. % used at end of environment
  316. %
  317. \def\dono@parskip{\if@parskipsaved \else \hold@parskip \fi}
  318.  
  319. % Reestablish the parskip
  320. % this is executed in \every@everypar
  321. %
  322. \def\controlled@parskip
  323.    {\if@parskipsaved \@parskipsavedno 
  324.         \parskip\@restoreparskip
  325.     \fi}
  326.  
  327. \def\noparskip{\parskip\z@ \@restoreparskip\z@}
  328.  
  329. %%%%%%%%%%%%%%%% Every Paragraph
  330. % \everypar is supposed to contain \every@everypar
  331. % as its first element.
  332. %
  333. \def\every@everypar{\controlled@indentation \controlled@parskip
  334.     \one@shot@coms \@headedno}
  335. \def\@defaulteverypar{\everypar={\every@everypar}}
  336. \add@start@command{\@defaulteverypar}
  337. \everypar{\Emessage{You forgot to give the \nxp\Start\@space command.}}
  338.  
  339. % Execute once
  340. %
  341. \newtoks\one@shot@toks
  342. \def\one@shot@coms{\temptoksa\one@shot@toks 
  343.     \global\one@shot@toks={}\the\temptoksa\temptoksa{}}
  344. \def\next@paragraph#1{\append@to@list{one@shot@toks}{#1}}
  345.  
  346. %%%%%%%%%%%%%%%% Every Math
  347. % just like \everypar.
  348. %
  349. \newtoks\every@everymath \newcount\high@fam
  350. \every@everymath{\high@fam\count18\relax
  351.     %\MainFace
  352.     \xp\math@setsize\style@sizes}
  353. \everymath{\the\every@everymath}
  354. \everydisplay{\the\every@everymath}
  355.  
  356. % Flush margins
  357. %
  358. \Distance:rightmarginstretch={0pt plus 6cm}
  359. \Distance:leftmarginstretch={0pt plus 6cm}
  360. \def\FlushLeft:#1 {\switch {\if\EqualString{#1}}
  361.     {yes} {\leftskip=1\leftskip}
  362.     {default} {\leftskip=1\leftskip
  363.                \advance\leftskip\leftmarginstretch}
  364.     \endswitch \relax}
  365. \FlushLeft:yes
  366. \def\FlushRight:#1 {\switch {\if\EqualString{#1}}
  367.     {yes} {\rightskip=1\rightskip}
  368.     {default} {\rightskip=1\rightskip
  369.                \advance\rightskip\rightmarginstretch}
  370.     \endswitch \relax}
  371. \FlushRight:no
  372.  
  373. %%%%%%% lijn
  374. % #1 : hoogte; #2 : lengte; #3 : elevatie
  375. % parameters kunnen van achter af aan weggelaten worden;
  376. % #4 is dummy, kan niet door de gebruiker gespecificeerd worden.
  377. % NNNNNNNNNBBBBBBBBBBBBB: #2 werkt nog niet!!!!!!!!!!!!
  378. \newtoks\@lijntoks
  379. \@lijntoks={}
  380.  
  381. % Lijn. Hier moet ik nog eens naar kijken.
  382. \@GenericOption{lijn}{
  383.     \edef\cs@e{\nxp\lijnanalyse:#1:\@restarg::::;}\cs@e
  384.     \edef\cs@e{\nxp\@add@toks{\nxp\leavevmode\the\@lijntoks}}
  385.     \cs@e}
  386.  
  387. \def\lijnanalyse:#1:#2:#3:#4;{\@lijntoks={}
  388.     \eqstring{#1}{}{}{\achteraanlijst{@lijntoks}{height #1 }}
  389.     \eqstring{#2}{}{\vooraanlijst{@lijntoks}{\leaders\hrule depth 0cm }
  390.                     \achteraanlijst{@lijntoks}{\hfill}}%
  391.                    {\eqstring{#2}{uitvullen}%
  392.                     {\vooraanlijst{@lijntoks}{\leaders\hrule depth 0cm }
  393.                      \achteraanlijst{@lijntoks}{\hfill}}%
  394.                     {\achteraanlijst{@lijntoks}{width \w@w{#2} }%
  395.                      \vooraanlijst{@lijntoks}{\vrule depth 0cm }}
  396. %    \eqstring{#3}{}{}{\vooraanlijst{@lijntoks}{\raise #3\hbox\bgroup}
  397. %                      \achteraanlijst{@lijntoks}{\egroup}}
  398.                    }
  399.     \achteraanlijst{@lijntoks}{\hbox{}} % \par doet \unskip!!!
  400.     }
  401.     
  402.  
  403. %%%%%%%%%%%%%%%%%%%%%%%%%%% accenten
  404. \gdef\allowhyphens{\penalty\@M \hskip\z@\relax}
  405.  
  406. {\catcode`\"=12 \gdef\hex{"}}
  407.  
  408. \catcode`\"=13
  409. \def "#1{\ifx#1i\discretionary{-}{i}{{\accent'177 \i}}%
  410.     \else\ifx#1-\allowhyphens-\penalty\z@\allowhyphens
  411.     \else\ifx#1"\hskip\z@\relax
  412.     \else\ifx#1!\hex
  413.     \else\ifx#1|\allowhyphens
  414.     \else {\accent'177 #1}\fi\fi\fi\fi\fi}
  415.       
  416. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
  417. %%%%%%%%%%%%%%%%%% C A S E
  418. %% 
  419. \def\UpperCase#1{\edef\cs@a{\uppercase{#1}}\cs@a}
  420.  
  421. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  422. %%%%%%%%%%% L E T T E R S P A C I N G
  423. %% 
  424. \def\LetterSpace
  425.    {\ifnextchar[\@LetterSpace %] <- to fool emacs
  426.                {\@LetterSpace[0ptplus1fil]}}
  427. \def\@LetterSpace[#1]#2{\def\@LS{\hskip#1\relax}%
  428.     \edef\cs@e{#2}\xp\@@LS\cs@e&}
  429. \def\@@LS#1#2&{#1\ifEmpty{#2}\xp\take@one\else\@LS\xp\@@LS\fi#2&}
  430.  
  431. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  432. %%%%%%%%%%%%%%% Interdictions
  433. %% 
  434. \def\NoHyphenation{\hyphenpenalty\@M \exhyphenpenalty\@M}
  435. \def\NoWidows{\widowpenalty\@M}
  436. \def\NoOrphans{\clubpenalty\@M}
  437.  
  438. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
  439. %%%%%%%%%%%%%%%%%% V E R B A T I M
  440. %% 
  441.  
  442. \def\setupverbatim{\let\do=\makeother \dospecials}
  443.  
  444. %% inline verbatim
  445. \def\ver{\leavevmode\begingroup \setupverbatim \obeyspaces\tt \@ver}
  446. \def\@ver#1{\def\@@ver##1#1{##1\endgroup}\@@ver}
  447.  
  448. %% display verbatim
  449. {\activecr %
  450.  \gdef\vVer>{\setupverbatim \obeyspaces %
  451.       \tt \parindent\z@ \noparskip \obeylines %
  452.       \ifnextchar
  453.       \@@Ver\@Ver}\noeol %
  454.  \gdef\@Ver#1<Rev{#1\VerStop}%
  455.  \gdef\@@Ver
  456.     #1<Rev{#1\VerStop}}
  457.  
  458. %% verbatim files
  459. \def\verbatimfile#1{\begingroup
  460.     \setupverbatim \obeyspaces \parindent\z@ \noparskip \obeylines %
  461.     \tt \input#1\relax
  462.     \endgroup}
  463.  
  464. \endinput
  465.  
  466. 92/11/08 white options created;
  467.      breakpoint protection in white options
  468. 92/11/18 AdaptiveDistance implemented
  469.